# 导入生成token模块
import jwt
# 导入响应数据模块
from django.http import JsonResponse
# 导入用户模型类
from users.models import *


# 封装一个响应数据函数
def re(status, msg, err):
    return JsonResponse({
        'status': status,
        'msg': msg,
        'data': err
    }, json_dumps_params={'ensure_ascii': False})


# 判断是否异步登录
def async_log(user_id, token_str):
    # 获取当前用户id信息
    user_info = Users.objects.get(userId=user_id)
    # 判断当前的token是否一致
    if user_info.token != token_str:
        return True


# 验证token装饰器
def token_dec(func):
    def wrap(request, *args, **kwargs):
        # 获取token
        token = request.META.get("HTTP_AUTHORIZATION")
        # 判断token
        if not token:
            return re(400, "获取失败！", {"err": "token为空，请先登录！"})
        # 通过前端和数据库token比较判断是否异步登录
        # 校验jwt
        try:
            res = jwt.decode(token[7:], "jiajia o(╥﹏╥)o (*^▽^*)", algorithms=["HS256"])
            # 校验成功 - 获取手机号
            phone = res['phone']
            # 获取当前登录的对象
            user = list(Users.objects.filter(phone=phone).values())
            # 把token带上
            user[0]['token'] = f"Bearer {token}"
            # 将用户对象返回出去
            request.myuser = user[0]

        except jwt.exceptions.ExpiredSignatureError:
            # 过期
            return re(400, "获取失败！", {"err": "身份认证失败, token已过期或失效！"})

        return func(request, *args, **kwargs)

    return wrap


# 验证后台token装饰器
def token_admin_dec(func):
    def wrap(request, *args, **kwargs):
        # 获取token
        token = request.META.get("HTTP_AUTHORIZATION")
        # 判断token
        if not token:
            return re(400, "获取失败！", {"err": "token为空，请先登录！"})
        # 通过前端和数据库token比较判断是否异步登录
        # 校验jwt
        try:
            res = jwt.decode(token[7:], "jiajia o(╥﹏╥)o (*^▽^*)", algorithms=["HS256"])
            # 校验成功 - 获取手机号
            id = res['id']
            # 获取当前登录的对象
            user = list(AuthUsers.objects.filter(id=id).values())
            # 把token带上
            user[0]['token'] = f"Bearer {token}"
            # 将用户对象返回出去
            request.myuser = user[0]

        except jwt.exceptions.ExpiredSignatureError:
            # 过期
            return re(400, "获取失败！", {"err": "身份认证失败, token已过期或失效！"})

        return func(request, *args, **kwargs)

    return wrap
